unit untEstornoContaReceber;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, untCadPadrao, Buttons, ExtCtrls, DB, Grids, DBGrids;

type
  TfrmEstornoContaReceber = class(TfrmCadPadrao)
    DBGrid2: TDBGrid;
    DSContasPagar: TDataSource;
    procedure btnConfirmarClick(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
    codigo_parcial, codigo_parcela : Integer;
    parcela : String;
  end;

var
  frmEstornoContaReceber: TfrmEstornoContaReceber;

implementation

uses UntDm;

{$R *.dfm}

procedure TfrmEstornoContaReceber.btnConfirmarClick(Sender: TObject);
var
  valorRecebimento, valorItem, situacao, valorPagoParcial, valorEstornado : string;
  
begin
  inherited;
  situacao := DM.CDSRecParcial.fieldByName('situacao').AsString;
  if (situacao = 'QUITADA') then
  Begin
    //estorno de um pagamento
    if MessageDlg('Deseja Efetuar Estorno deste Pagamento?', mtConfirmation, [mbYes,mbNo],0) = mrYes then
    begin
      valorRecebimento := DM.CDSRecParcial.fieldByName('valor_recebido').AsString;
      valorItem := DM.CDSParcelas.fieldByName('valor_parcela').AsString;

      // busca o valor do campo VALO_PAGO, la no banco para somar com o  atual

      DM.SDSComando.CommandText :=  'SELECT valor_pago as valor from "Parcelas" '+
                                    'WHERE parcela = :parcela AND cod_parcela = :cod_parcela ';
      DM.SDSComando.ParamByName('parcela').AsString := DM.CDSParcelas.fieldByName('parcela').AsString;
      DM.SDSComando.ParamByName('cod_parcela').AsInteger := DM.CDSParcelas.fieldByName('cod_parcela').AsInteger;
      DM.SDSComando.Open;
      valorPagoParcial := DM.SDSComando.FieldByName('valor').AsString;
      DM.SDSComando.Close;

      DM.SDSComando.CommandText :=  'SELECT valor_recebido as valor from "RecebimentoParcial" '+
                                    'WHERE cod_parcial = :cod_parcial and cod_parcela = :cod_parcela '+
                                    ' and parcela = :parcela';
      DM.SDSComando.ParamByName('cod_parcial').AsInteger := DM.CDSRecParcial.fieldByName('cod_parcial').AsInteger;
      DM.SDSComando.ParamByName('cod_parcela').AsInteger := DM.CDSRecParcial.fieldByName('cod_parcela').AsInteger;
      DM.SDSComando.ParamByName('parcela').AsString := DM.CDSRecParcial.fieldByName('parcela').AsString;
      DM.SDSComando.Open;
      valorEstornado := DM.SDSComando.FieldByName('valor').AsString;
      DM.SDSComando.Close;

      if valorPagoParcial = '' then
      begin
        valorPagoParcial := '0';
      end;
      if valorEstornado = '' then
      begin
        valorEstornado := '0';
      end;
      valorPagoParcial := FloatToStr(StrToFloat(valorPagoParcial) - StrToFloat(valorEstornado));
      valorPagoParcial := formatfloat('########0.00', strtofloat(valorPagoParcial));
      

      DM.SDSComando.CommandText :=  'UPDATE "Parcelas" SET valor_pago = :valor_pago, '+
                                    ' valor_parcela = :valor_parcela, situacao = :situacao '+
                                    'WHERE parcela = :parcela and cod_parcela = :cod_parcela';
      DM.SDSComando.ParamByName('parcela').AsString := DM.CDSParcelas.fieldByName('parcela').AsString;
      DM.SDSComando.ParamByName('cod_parcela').AsInteger := DM.CDSParcelas.fieldByName('cod_parcela').AsInteger;
      DM.SDSComando.ParamByName('valor_parcela').AsString := FloatToStr(StrToFloat(valorRecebimento) + StrToFloat(valorItem));
      DM.SDSComando.ParamByName('situacao').AsString := 'PARCIAL';
      DM.SDSComando.ParamByName('valor_pago').AsString := valorPagoParcial;
      DM.SDSComando.ExecSQL();

      //atualiza a tabela recebimento e atualiza a grid
      DM.SDSComando.CommandText :=  'UPDATE "RecebimentoParcial" SET situacao = :situacao '+
                                    'WHERE cod_parcial = :cod_parcial and cod_parcela = :cod_parcela '+
                                    ' and parcela = :parcela';
      DM.SDSComando.ParamByName('cod_parcial').AsInteger := DM.CDSRecParcial.fieldByName('cod_parcial').AsInteger;
      DM.SDSComando.ParamByName('cod_parcela').AsInteger := DM.CDSRecParcial.fieldByName('cod_parcela').AsInteger;
      DM.SDSComando.ParamByName('parcela').AsString := DM.CDSRecParcial.fieldByName('parcela').AsString;
      DM.SDSComando.ParamByName('situacao').AsString := 'ESTORNO';
      DM.SDSComando.ExecSQL();
      DM.CDSRecParcial.Refresh;
      DM.CDSParcelas.Refresh;
      end;
  end else
    begin
      ShowMessage('Parcial Ja estornado');
  end;

  // sai do formulario
  Close;
end;

end.
